<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
</body>
</html>
<script>
//21-05-19-白-北京海淀-北京电视台
//类的方法  

//  constructor 方法  
//  constructor 方法是类的默认方法，通过 new 命令生成对象实例时，自动调用该方法（默认返回实例对象 this）。
//  一个类必须有 constructor 方法，如果没有显式定义，一个空的 constructor 方法会被默认添加。


// 一个类只能拥有一个名为 “constructor” 的特殊方法，如果类包含多个 constructor 的方法，则将抛出 一个 SyntaxError 。
class Person {
   constructor(x, y) {
    this.x = x    //默认返回实例对象 this
    this.y = y
  }
  toString() {
    console.log(this.x + ', ' + this.y)
  }
}


//constructor 啥子?
//每一个类必须要由一个constructor 如果没有显示声明 js引擎会自动添加一个空的构造函数
//看代码                       
class person3 {
}
//等于 
class person3 {
    constructor(){}
}


// 注意 
// 在类中声明方法的时候，方法前不加 function 关键字
// 方法之间不要用逗号分隔，否则会报错
// 类的内部所有定义的方法，都是不可枚举的（non-enumerable）

//注意 与es5一样 实例的属性除非 显示定义在其本身(即this对象)上 否则都是定义在原型上面 
class Point {
  constructor(x,y){
    this.x = x;
    this.y = y;
    
  }
  toString(){
    return `this.x + this.y`;
  }
}
var point = new Point();
point.toString()    //(2,3)
point.hasOwnProperty("x")                //true
point.hasOwnProperty("y")                //true   //在这 x&&y都是实例对象point自身的属性(因为定义在this变量上) // 所以返回true 
point.hasOwnProperty("toString")         //false  //toString是原型对象的属性 (因为定义在Point类上)             //所以返回false 
point._proto_.hasOwnProperty("toString") //true  

//加两个实例 
var p1 = new Point();
var p2 = new Point();
p1._proto_ === p2._proto_                //true    这个不建议使用 
/*  上面代码中 p1和p2 都是point的实例 他们的原型都是Point.prototype 所以 _proto_属性是相等的 
    即是说 可以通过实例的_proto_ 属性为 "类" 添加方法  
*/








</script>